home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / C and C++ / Text⁄Files / FaceLift / FaceLift Folder / FLFileStuff.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-02-16  |  5.3 KB  |  249 lines  |  [TEXT/KAHL]

  1. /*
  2.  * FLFileStuff.c - file routines of general usefulness.
  3.  */
  4.  
  5.  
  6. # include    "TransSkel.h"
  7.  
  8. # include    "FLFileStuff.h"
  9. # include    "FLMaca.h"
  10. # include    "FLMapInfo.h"
  11. # include    "FaceLift.h"
  12.  
  13.  
  14. /* ---------------------------------------------------------------- */
  15. /*                    Generic Error Message Routine                    */
  16. /* ---------------------------------------------------------------- */
  17.  
  18.  
  19. /*
  20.  * If errNo isn't noErr, then print a message.  The message is found
  21.  * in the 'STR ' resource of the same number as the file err.  If
  22.  * no resource is found with that number, use a default message.
  23.  */
  24.  
  25. void
  26. FileErr (OSErr errNo)
  27. {
  28. StringHandle    h;
  29. Str255            numStr;
  30. Str255            meaning;
  31.  
  32.     if (errNo == noErr)
  33.         return;
  34.  
  35.     CopyString ("\pNo error message available", meaning);    /* default */
  36.  
  37.     h = GetString (errNo);
  38.     if (h != nil && HomeResFile ((Handle) h) == CurResFile ())
  39.     {
  40.         HLock ((Handle) h);
  41.         CopyString (*h, meaning);
  42.         HUnlock ((Handle) h);
  43.         ReleaseResource ((Handle) h);
  44.     }
  45.  
  46.     NumToString ((long) errNo, numStr);
  47.     Message ("\pI/O error ", numStr, "\p: ", meaning);
  48. }
  49.  
  50.  
  51. /* ---------------------------------------------------------------- */
  52. /*            Routines to get or open files for input or output        */
  53. /* ---------------------------------------------------------------- */
  54.  
  55.  
  56. static Point    dlogWhere = { 70, 100 };    /* Get/PutFile dlog location */
  57. static Str255    buttonTitle;                /* "Open" button title */
  58.  
  59.  
  60. /*
  61.  * GFFilter is a SFGetFile filter to set the name of the "Open"
  62.  * button.
  63.  */
  64.  
  65. static pascal short
  66. GFFilter (short theItem, DialogPtr theDialog)
  67. {
  68.     if (theItem == -1)    /* change "Open" button name */
  69.         SetCTitle (SkelGetDlogCtl (theDialog, 1), buttonTitle);
  70.     return (theItem);
  71. }
  72.  
  73.  
  74. /*
  75.  * Get a filename for input.
  76.  */
  77.  
  78. Boolean
  79. GetInputFile (StringPtr bTitle, OSType type, SFReply *inFile)
  80. {
  81.     CopyString (bTitle, buttonTitle);    /* set title for "Open" button */
  82.     SFPGetFile (dlogWhere, "\p", nil, 1, &type, GFFilter, inFile,
  83.                             getDlgID, SkelDlogFilter (nil, true));
  84.     SkelRmveDlogFilter ();
  85.     SkelDoUpdates ();
  86.     return (inFile->good);
  87. }
  88.  
  89.  
  90. /*
  91.  * Open a filename for input.
  92.  */
  93.  
  94. Boolean
  95. OpenInputFile (SFReply *inFile, short *f)
  96. {
  97. OSErr        result;
  98.  
  99.     result = FSOpen (inFile->fName, inFile->vRefNum, f);
  100.     if (result != noErr)
  101.     {
  102.         FileErr (result);
  103.         Message3 ("\pCannot open \"", inFile->fName, "\p\".");
  104.     }
  105.     return (result == noErr);
  106. }
  107.  
  108.  
  109. /*
  110.  * Get a filename for output.
  111.  * Pass the current name and volume reference, and whether to
  112.  * ask for a name even if one is known.  Return the information
  113.  * in the SFReply record.
  114.  *
  115.  * Note: if ask is false and the name isn't "untitled", the name
  116.  * passed is assumed to be the correct name to use and is returned.
  117.  * This may seem odd, but eliminates making the check every place
  118.  * from which this is called.
  119.  */
  120.  
  121. Boolean
  122. GetOutputFile (Boolean ask, StringPtr fName, short vRefNum, SFReply *outFile)
  123. {
  124.     CopyString (fName, outFile->fName);
  125.     outFile->vRefNum = vRefNum;
  126.     if (ask || CompareString ("\puntitled", fName) == 0)
  127.     {
  128.         SFPPutFile (dlogWhere, "\pWrite to...", fName, nil, outFile,
  129.                                     putDlgID, SkelDlogFilter (nil, true));
  130.         SkelRmveDlogFilter ();
  131.         SkelDoUpdates ();
  132.         if (!outFile->good)
  133.             return (false);
  134.     }
  135.     return (true);
  136. }
  137.  
  138.  
  139. /*
  140.  * Open output file, creating if necessary.  Truncate contents as well.
  141.  */
  142.  
  143. Boolean
  144. OpenOutputFile (SFReply *outFile, OSType creator, OSType type, short *f)
  145. {
  146. FInfo    fndrInfo;
  147. OSErr    result;
  148.  
  149.     if (GetFInfo (outFile->fName, outFile->vRefNum, &fndrInfo) == noErr)
  150.     {
  151.         if (fndrInfo.fdCreator != creator || fndrInfo.fdType != type)
  152.         {
  153.             Message3 ("\p\"", outFile->fName, "\p\" is not a file of the proper type");
  154.             return (false);
  155.         }
  156.     }
  157.     else    /* Doesn't exist.  Try to create it. */
  158.     {
  159.         result = Create (outFile->fName, outFile->vRefNum, creator, type);
  160.         if (result != noErr)
  161.         {
  162.             FileErr (result);
  163.             Message3 ("\pCan't create \"", outFile->fName, "\p\"");
  164.             return (false);
  165.         }
  166.         else                /* new file now - set Finder info */
  167.         {
  168.             (void) GetFInfo (outFile->fName, outFile->vRefNum, &fndrInfo);
  169.             fndrInfo.fdFlags &= ~1;        /* clear init'ed bit */
  170.             fndrInfo.fdLocation.h = 0;
  171.             fndrInfo.fdLocation.v = 0;
  172.             fndrInfo.fdFldr = 0;
  173.             (void) SetFInfo (outFile->fName, outFile->vRefNum, &fndrInfo);
  174.         }
  175.     }
  176.  
  177.     result = FSOpen (outFile->fName, outFile->vRefNum, f);
  178.     if (result != noErr)
  179.     {
  180.         FileErr (result);
  181.         Message3 ("\pCan't write to \"", outFile->fName, "\p\".");
  182.     }
  183.     else
  184.         (void) SetEOF (*f, 0L);    /* clear contents */
  185.  
  186.     return (result == noErr);
  187. }
  188.  
  189.  
  190. /* ---------------------------------------------------------------- */
  191. /*                    Seek, Read, Write on open files                    */
  192. /* ---------------------------------------------------------------- */
  193.  
  194.  
  195. /*
  196.  * Seek to given position in file
  197.  */
  198.  
  199. void
  200. FileSeek (short f, long pos)
  201. {
  202.     (void) SetFPos (f, fsFromStart, pos);
  203. }
  204.  
  205.  
  206. /*
  207.  * Read the given number of bytes from a file.  Return false
  208.  * if fail.
  209.  */
  210.  
  211. Boolean
  212. FileRead (short f, Ptr p, long amount)
  213. {
  214. OSErr    result;
  215. long    read;
  216. Boolean    ok = false;
  217.  
  218.     read = amount;
  219.     if ((result = FSRead (f, &read, p)) != noErr && result != eofErr)
  220.         FileErr (result);
  221.     else
  222.         ok = (amount == read);
  223.     return (ok);
  224. }
  225.  
  226.  
  227. /*
  228.  * Write the given number of bytes from a file.  Return false
  229.  * if fail.
  230.  */
  231.  
  232. Boolean
  233. FileWrite (short f, Ptr p, long amount)
  234. OSErr    result;
  235. long    written;
  236. Boolean    ok = false;
  237.  
  238.     written = amount;
  239.     if ((result = FSWrite (f, &written, p)) != noErr)
  240.         FileErr (result);
  241.     else if (amount != written)
  242.         Message1 ("\pIncomplete write operation");
  243.     else
  244.         ok = true;
  245.     return (ok);
  246. }
  247.  
  248.